xend/acm: Fixes to labelling of resources.
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 15 Apr 2008 09:24:55 +0000 (10:24 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 15 Apr 2008 09:24:55 +0000 (10:24 +0100)
Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
tools/python/xen/util/xsm/acm/acm.py

index 8a5c270ad0fa486d5c5194ad62fd18d2a27d89b7..e3ec15c80693ad7320f759ef4f105d6eb4bc25bd 100644 (file)
@@ -1223,8 +1223,10 @@ def set_resource_label(resource, policytype, policyref, reslabel, \
             if tmp[2] != oreslabel:
                 return -xsconstants.XSERR_BAD_LABEL
         if resource.startswith('vlan:'):
-            if tuple([policytype, policyref, reslabel]) in access_control.values():
-                return -xsconstants.XSERR_BAD_LABEL
+            for key, value in access_control.items():
+                if value == tuple([policytype, policyref, reslabel]) and \
+                   key.startswith('vlan:'):
+                    return -xsconstants.XSERR_BAD_LABEL
         if reslabel != "":
             new_entry = { resource : tuple([policytype, policyref, reslabel])}
             access_control.update(new_entry)
@@ -1407,6 +1409,8 @@ def change_acm_policy(bin_pol, del_array, chg_array,
         dominfos = XendDomain.instance().list('all')
 
         log.info("----------------------------------------------")
+
+        label_changes = []
         # relabel resources
 
         access_control = {}
@@ -1438,7 +1442,7 @@ def change_acm_policy(bin_pol, del_array, chg_array,
             elif label not in polnew_reslabels:
                 # label been removed
                 policytype = xsconstants.INVALID_POLICY_PREFIX + policytype
-                run_resource_label_change_script(key, "", "remove")
+                label_changes.append(key)
                 polname = policy
             else:
                 # no change to label
@@ -1506,6 +1510,8 @@ def change_acm_policy(bin_pol, del_array, chg_array,
 
         rc, errors = hv_chg_policy(bin_pol, del_array, chg_array)
         if rc == 0:
+            for key in label_changes:
+                run_resource_label_change_script(key, "", "remove")
             # Write the relabeled resources back into the file
             dictio.dict_write(access_control, "resources", res_label_filename)
             # Properly update all VMs to their new labels